from aiosignal import Signal

from app.event.listener import log_event_handler
from app.schemas.log import LogDTO


class Event:
    """
    事件管理类

    用于管理系统中各种异步事件的发送和处理。通过信号(Signal)机制实现
    发布-订阅模式，解耦事件的发送方和处理方。
    """

    def __init__(self) -> None:
        """
        初始化事件管理器，创建各种事件信号

        目前主要包含日志事件信号，后续可以扩展其他类型的事件信号。
        """
        # 创建一个日志事件信号，接受一个LogDTO对象作为参数
        self.log_signal = Signal[LogDTO](owner=self)
        # 可以在此处创建其它类型的事件信号...

    async def send_log_event(self, log_dto: LogDTO) -> None:
        """
        发送日志事件

        通过日志事件信号广播日志信息，所有注册的监听器都会收到该事件。

        :param log_dto: 日志数据传输对象，包含日志的详细信息
        :return: None
        """
        # 冻结信号，防止在发送过程中被修改
        self.log_signal.freeze()
        # 异步发送事件给所有订阅者
        await self.log_signal.send(log_dto)


# 实例化事件管理器
event = Event()


def register_event_handler() -> None:
    """
    注册事件处理器

    将事件监听器注册到对应的事件信号上，当事件发生时会自动调用相应的处理函数。
    """
    # 注册日志事件处理器
    event.log_signal.append(log_event_handler)
    # 注册其它的信号处理程序...


def unregister_event_handler() -> None:
    """
    注销事件处理器

    从事件信号中移除已注册的监听器，通常在应用关闭时调用以清理资源。
    """
    # 注销日志事件处理器
    event.log_signal.remove(log_event_handler)
    # 注销其它的信号处理程序...
